package edu.nf.ch11.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @author wangl
 * @date 2025/4/18
 * 回调处理器（负责调用目标对象的行为,并增加一些额外的逻辑增强）
 */
public class ServiceInvocationHandler implements InvocationHandler {

    /**
     * 目标对象
     */
    private Object target;

    /**
     * 构造方法传入目标对象
     * @param target
     */
    public ServiceInvocationHandler(Object target) {
        this.target = target;
    }

    /**
     * 回调方法(由代理对象负责调用)，在这个方法中调用目标行为
     * proxy: 运行时由JVM动态创建的代理对象
     * method: 目标对象要执行的方法
     * args：目标对象方法的参数
     */
    @Override
    public Object invoke(Object proxy,
                         Method method,
                         Object[] args) throws Throwable {
        before();
        //调用目标方法,并接收返回值
        Object returnVal = method.invoke(target,args);
        after();
        return returnVal;
    }

    /**
     * 前置增强（通知）
     */
    private void before() {
        System.out.println("调用目标方法前增强...");
    }

    /**
     * 后置增强（通知）
     */
    private void after() {
        System.out.println("调用目标方法后增强...");
    }

    private void around() {

    }
}